iT邦幫忙

2022 iThome 鐵人賽

DAY 22
0
自我挑戰組

被MongoDB用Aggregate暴打的後端小菜雞日記系列 第 22

被MongoDB用Aggregate暴打的後端小菜雞日記-day22-那些年你不知道的Aggregate大小事

  • 分享至 

  • xImage
  •  

介紹20天的Aggregation Pipeline,基本上我把大部分的常用到的stages和operators都講解過一輪了,剩下少數沒介紹到的部分,主要是實務上我沒有用過,再看官方文件的時候,覺得有點複雜、也想不太到有什麼場景可以使用到,與其硬講一個自己不熟悉的語法,我覺得不如跳過。

但是還有幾個我覺得看起來蠻有趣的語法,如果大家有興趣可以點擊連結,去官方文件看一下它的用法。

  1. $unwind:可以將陣列資料拆分成獨立的document,這算蠻常見的語法,但我實務上沒用過。
  2. $accumulator:計算相關的操作符,個人覺得設定有些複雜。
  3. $function:可以直接寫一個函式,用來整理資料,第一次看到覺得MongoDB什麼功能都有很神奇。
  4. $convert:可以將資料的格式,轉變成你想要的資料型態,很萬用的那種,但是轉換的規則,建議還是看一下官方的說明。
  5. $type:可以讓使用者確認代入值,它的資料型態,但我想不太到什麼情況會用這個操作符,寫入資料庫的時候,不就應該確定資料格式了嗎(?

另外在使用前面介紹的語法,還有一點比較需要注意的是MongoDB版本,如果剛好專案的MongoDB版本比較舊,可能會有部分新版的語法是無法使用的,如果是個人的小型專案,升級到最新版本應該不會有太大問題,但如果是已經在運行的產品,可能就必須考慮一下升級後,是否有前後版本不相容的問題。


接下來進入正題,引用官方文件的解說,快速向大家說明一下Aggregate使用上的一些限制。

Changed in version 5.0: MongoDB 5.0 limits the number of aggregation pipeline stages allowed in a single pipeline to 1000

在使用aggregation單一個pipeline,一次最多寫入1000的pipeline stages操作,但基本上正常使用根本達不到這個限制XD。

Starting in MongoDB 6.0, the allowDiskUseByDefault parameter controls whether pipeline stages that require more than 100 megabytes of memory to execute write temporary files to disk by default.

在使用aggregation會有記憶體使用的上的限制,預設會是100MB,在一開始寫aggregate建議把$match放在第一步,先過濾掉多餘不會使用到的資料,但如果真的資料量還是太大超過上限,可以透過allowDiskUseByDefault這個參數關閉預設100MB的上限,此時會改用硬碟寫入pipeline所產生的臨時文件。

但我目前使用上也沒有突破過100MB上限,改用硬碟操作aggregation效能到底會變得多差,其實不太清楚。

If the pipeline starts with an exact $match on a shard key, and the pipeline does not contain $out or $lookup stages, the entire pipeline runs on the matching shard only.

如果要搜尋的collection本身有做分片(Sharding)的話,必須注意在pipeline裡面沒辦法使用$out$lookup這兩個語法,如果真的有使用到,也只會作用在primary shard而已。


參考的官方文件

  1. Aggregation Pipeline Limits
  2. Aggregation Pipeline and Sharded Collections

本篇文章同步放在我的部落格,大家有空可以進來逛逛


上一篇
被MongoDB用Aggregate暴打的後端小菜雞日記-day21-文字操作符
下一篇
被MongoDB用Index暴打的後端小菜雞日記-day23- 什麼是index?
系列文
被MongoDB用Aggregate暴打的後端小菜雞日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言